# 使用队列实现多线程，控制一个资源的共享。
from threading import Thread
from queue import Queue
import time
import random


class Producer(Thread):  # 继承类
    def __init__(self, queue):
        Thread.__init__(self)
        self.queue = queue

    def run(self):
        for i in range(5):
            item = random.randint(0, 256)
            self.queue.put(item)  # 在队列中放入一个元素
            print('Producer notify:item N %d appended to queue by %s\n' % (item, self.name))
            time.sleep(1)


class Consumer(Thread):
    def __init__(self, queue):
        Thread.__init__(self)
        self.queue = queue

    def run(self) -> None:
        while True:
            item = self.queue.get()  # 在队列中获得一个元素，并删除
            print('Consumer notify : %d popped from queue by %s' % (item, self.name))
            self.queue.task_done()  # 每次调用一个元素时需要调用这个方法，表示工作已经完成。


if __name__ == '__main__':
    queue = Queue()
    t1 = Producer(queue)  # 一个生产者，三个消费者，同时工作，
    t2 = Consumer(queue)
    t3 = Consumer(queue)
    t4 = Consumer(queue)

    t1.start()
    t2.start()
    t3.start()
    t4.start()

    t1.join()
    t2.join()
    t3.join()
    t4.join()
